//
// Created by QU on 24-6-18.
//

#include <iostream>
#include <fstream>
#include <sstream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>

using std::cout, std::endl, std::cin;

int int_val = 666;

struct Base {
    virtual void func(int i = sizeof int_val) {
        // sizeof int_val 是一个编译时表达式，它返回 int_val 的大小。   msvc不支持
        // 不求值语境.....
        std::cout << "Base " << i << std::endl;
    }
};

struct Derived : Base {
    void func(int i = 10) override {
        std::cout << "Derived " << i << std::endl;
    }
};

int main(int argc, char const *argv[]) {
    auto ptr = std::unique_ptr<Base>(new Derived());
    ptr->func();
    // Derived 7
    // 为什么不是 Derived 10

    // 这里发生了一个有趣的现象。让我们来解释一下。
    // 在 C++ 中，虚函数的默认参数是静态绑定的，而不是动态绑定的。这意味着默认参数的选择是在编译时确定的，而不是在运行时。
    //
    //   下面是详细的解释:
    // ptr 是一个指向 Derived 对象的 unique_ptr<Base> 智能指针。
    // 调用 ptr->func() 时，由于 func 在 Base 类中是虚函数，因此会(根据虚函数表)进行动态绑定。
    // 但是，在编译时，编译器只知道 ptr 的静态类型是 Base 指针，因此它在编译时就决定了调用 Base::func(int i = 7)。
    // 所以实际上调用的是 Base::func()，而不是 Derived::func()，并且默认参数 i 被解析为 7。

    return 0;
}
